package com.flying.file;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * @author 刘鹏飞
 * @ClassName FileTest
 * @Date 2024/12/22 18:47
 * @Created by 刘鹏飞
 * @Description File类的使用
 * java.io.File:  代表文件和目录,用于读取文件/创建文件/删除文件/修改文件
 *
 *
 */
public class FileTest {


    /*
     * `public File(String pathname) ` ：以pathname为路径创建File对象，可以是绝对路径或者相对路径，如果pathname是相对路径，则默认的当前路径在系统属性user.dir中存储。
     * `public File(String parent, String child) ` ：以parent为父路径，child为子路径创建File对象。
     * `public File(File parent, String child)` ：根据一个父File对象和子文件路径创建File对象
     *
     * 文件路径表示方式
     * 方式1： 绝对路径： 以 windows操作系统为例，包括盘符在内的文件或文件目录完整目录
     * 方式2:  相对于某一个文件目录来讲的相对的位置
     *          在IDEA中，如果使用单元测试方法，相对于当前的module来讲
     *                    如果使用main()方法：相对于当前工程来讲
     */

    @Test
    public void test1(){

        // public File(String pathName)      内存层面的对象
        File file = new File("e:/io/hello.txt");

        File file1 = new File("abc");

        System.out.println(file.getAbsoluteFile());
        System.out.println(file1.getAbsoluteFile());



    }


    /*
     * `public File(String parent, String child) ` ：以parent为父路径，child为子路径创建File对象。
     * `public File(File parent, String child)` ：根据一个父File对象和子文件路径创建File对象
     */

    @Test
    public void test2(){
       // public File(String parent, String child)
       // 参数1: 一定是个文件目录
       // 参数2: 可以是一个文件,也可以是一个文件目录
        File file = new File("d:\\io", "abc.txt");
        File file1 = new File("abc", "efg");


        // public File(File parent, String child)`: 根据一个父File对象和子文件路径创建File对象
        // 参数一: 一定是一个文件目录
        // 参数二: 可以是一个文件,也可以是一个文件目录

        File file2 = new File(file1, "avx.txt");

    }

    /*
    常用方法:
   、获取文件和目录基本信息
    * public String getName() ：获取名称
    * public String getPath() ：获取路径
    * `public String getAbsolutePath()`：获取绝对路径
    * public File getAbsoluteFile()：获取绝对路径表示的文件
    * `public String getParent()`：获取上层文件目录路径。若无，返回null
    * public long length() ：获取文件长度（即：字节数）。不能获取目录的长度。
    * public long lastModified() ：获取最后一次的修改时间，毫秒值
    */

    @Test
    public void test3() throws IOException {

        File file = new File("e:/io/hello.txt");

        boolean newFile = file.createNewFile();
        System.out.println("newFile = " + newFile);

        System.out.println("File是否存在: "+file.exists());
        System.out.println("File是否是目录: "+file.isDirectory());
        System.out.println("File是否是文件: "+file.isFile());
        System.out.println("File最后修改的时间: "+file.lastModified());
        System.out.println("File的大小: "+file.length());
        System.out.println("File的名称: "+file.getName());
        String absolutePath = file.getAbsolutePath();
        System.out.println("File的绝对路径:" + absolutePath);   // 返回的是String
        File absoluteFile = file.getAbsoluteFile();
        System.out.println("File的绝对路径的文件:" + absoluteFile);  // 返回的是一个File对象



    }

    /*
    mkdir(): 目录中有一个不存在,则不会创建整个目录树
    mkdirs():目录结构总有一个不存在没关系;会自动创建目录树
     */
    @Test
    public void test4(){
        File file = new File("e:\\io\\电影\\华语\\大陆");
        boolean mkdir = file.mkdir();
        System.out.println("mkdir = " + mkdir); // false

        boolean mkdirs = file.mkdirs();
        System.out.println("mkdirs = " + mkdirs);  // true

    }


    /* 列出目录的下一级
     * public String[] list() ：返回一个String数组，表示该File目录中的所有子文件或目录。
     * public File[] listFiles() ：返回一个File数组，表示该File目录中的所有的子文件或目录。
     */
    @Test
    public void test5(){
        File file = new File("E:\\io");
        String[] list = file.list();
        System.out.println(Arrays.toString(list));


        File[] files = file.listFiles();
        for (File file1 : files) {
            System.out.println("file1 = " + file1);
        }

    }






}
